package com.example.producerandconsumer.waitnotify;

import java.util.Queue;
import java.util.Random;

public class Producer implements Runnable {
    private final Queue<Data> queue;
    // 传入Queue的固定长度
    private final int length;
    private final int num;

    public Producer(Queue<Data> queue, int length, int num) {
        this.queue = queue;
        this.length = length;
        this.num = num;
    }

    @Override
    public void run() {
        System.out.println("生产者" + num + "开始生产！！！！！！！！！！");
        Data data = null;
        Random random = new Random();
        try {
            // 最外层while循环表示当前生产者可以循环使用
            while (true) {
                synchronized (queue) {
                    while (queue.size() == length) {
                        System.out.println("生产者" + num + "生产产品失败，队列满啦~~~");
                        // 再继续睡
                        queue.wait();
                    }
                    // 终于可以生产产品啦！
                    data = new Data("生产者" + num + "生产产品");
                    System.out.println("生产者" + num + "生产了产品");
                    queue.offer(data);
                    // 唤醒其他消费者来消费
                    queue.notifyAll();
                }
                // 模拟生产耗费时间
                Thread.sleep(random.nextInt(1000));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 不推荐这种方式，因为会出现下面这种情况
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产了产品
    //生产者3生产产品失败，队列满啦~~~
    //生产者1生产产品失败，队列满啦~~~
    //生产者2生产产品失败，队列满啦~~~
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费了生产者3生产产品
    //消费者2消费失败，当前队列为空啦~
    //消费者1消费失败，当前队列为空啦~
    //消费者3消费失败，当前队列为空啦~
//    @Override
//    public void run() {
//        System.out.println("生产者" + num + "开始生产！！！！！！！！！！");
//        Data data = null;
//        Random random = new Random();
//        try {
//            synchronized (queue) {
//                while (true) {
//                    if (queue.size() == length) {
//                        System.out.println("生产者" + num + "生产产品失败，队列满啦~~~");
//                        // 再继续睡
//                        queue.wait();
//                    } else {
//                        // 终于可以生产产品啦！
//                        data = new Data("生产者" + num + "生产产品");
//                        System.out.println("生产者" + num + "生产了产品");
//                        queue.offer(data);
//                        // 唤醒其他消费者来消费
//                        queue.notifyAll();
//                    }
//                }
//            }
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//    }
}
